FALSE Registered S3 methods overwritten by 'dbplyr':
FALSE   method         from
FALSE   print.tbl_lazy     
FALSE   print.tbl_sql      
FALSE -- Attaching packages -------------------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
FALSE v ggplot2 3.3.5     v purrr   0.3.4
FALSE v tibble  3.1.6     v dplyr   1.0.7
FALSE v tidyr   1.1.4     v stringr 1.4.0
FALSE v readr   2.1.1     v forcats 0.5.1
FALSE -- Conflicts ----------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
FALSE x dplyr::filter() masks stats::filter()
FALSE x dplyr::lag()    masks stats::lag()
FALSE 
FALSE Attaching package: ‘scales’
FALSE 
FALSE The following object is masked from ‘package:purrr’:
FALSE 
FALSE     discard
FALSE 
FALSE The following object is masked from ‘package:readr’:
FALSE 
FALSE     col_factor
FALSE 
FALSE Registered S3 method overwritten by 'data.table':
FALSE   method           from
FALSE   print.data.table     
FALSE Registered S3 method overwritten by 'htmlwidgets':
FALSE   method           from         
FALSE   print.htmlwidget tools:rstudio
FALSE 
FALSE Attaching package: ‘plotly’
FALSE 
FALSE The following object is masked from ‘package:ggplot2’:
FALSE 
FALSE     last_plot
FALSE 
FALSE The following object is masked from ‘package:stats’:
FALSE 
FALSE     filter
FALSE 
FALSE The following object is masked from ‘package:graphics’:
FALSE 
FALSE     layout
FALSE 
FALSE data.table 1.14.2 using 4 threads (see ?getDTthreads).  Latest news: r-datatable.com
FALSE 
FALSE Attaching package: ‘data.table’
FALSE 
FALSE The following objects are masked from ‘package:dplyr’:
FALSE 
FALSE     between, first, last
FALSE 
FALSE The following object is masked from ‘package:purrr’:
FALSE 
FALSE     transpose
FALSE 
FALSE 
FALSE Attaching package: ‘lubridate’
FALSE 
FALSE The following objects are masked from ‘package:data.table’:
FALSE 
FALSE     hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year
FALSE 
FALSE The following objects are masked from ‘package:base’:
FALSE 
FALSE     date, intersect, setdiff, union
FALSE 
FALSE Loading required package: kableExtra
FALSE 
FALSE Attaching package: ‘kableExtra’
FALSE 
FALSE The following object is masked from ‘package:dplyr’:
FALSE 
FALSE     group_rows
FALSE 
FALSE 
FALSE Attaching package: ‘timetk’
FALSE 
FALSE The following object is masked from ‘package:data.table’:
FALSE 
FALSE     :=
FALSE 
FALSE Loading required package: svd
FALSE Loading required package: forecast
FALSE Registered S3 method overwritten by 'quantmod':
FALSE   method            from
FALSE   as.zoo.data.frame zoo 
FALSE 
FALSE Attaching package: ‘Rssa’
FALSE 
FALSE The following object is masked from ‘package:stats’:
FALSE 
FALSE     decompose
covid_NAs <- covid %>% 
  group_by(location) %>% 
  summarise_all(funs(sum(is.na(.)))) %>% 
  pivot_longer(cols = -location, names_to = "Variable", values_to = "NAs") %>% 
  mutate(Percent = round(NAs / nrow(covid) * 100 ,2)) %>% 
  arrange(-NAs)
Warning: `funs()` was deprecated in dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
covid_NAs %>% 
  group_by(location) %>% 
  summarise(total_pct_na = sum(Percent)) %>% 
  arrange(total_pct_na) %>% 
  datatable(filter = 'top')
#Helper function for filtering data
my_data <- function(country_covid_filter, country_gisaid_filter){
  data <- covid %>% 
    filter(location == country_covid_filter)
  gisaid_data <- gisaid_variants %>% 
    filter(Country == country_gisaid_filter)
  data <- left_join(data, gisaid_data, by = "date")
  data
}

us <- my_data("United States", "USA")
variants_plot <- ggplot(data = us, aes(x = date)) +
  geom_area(aes(y = perc_sequences, color = variant, fill = variant), position = "dodge", show.legend = FALSE) +
  theme_minimal()


cases_plot <-
  ggplot(data = us, aes(x = date)) +
  geom_line(aes(y = new_cases_per_million), show.legend = FALSE) +
  geom_line(aes(y = new_deaths_per_million)) + 
  theme_minimal()


deaths_plot <- ggplot(data = us, aes(x = date)) +
  geom_line(aes(y = new_deaths_per_million)) + 
  theme_minimal()


vaccinations_plot <- ggplot(us, aes(x = date)) +
  geom_line(aes(y = new_vaccinations_smoothed_per_million)) +
  theme_minimal()


variants_cases_plot <- ggplot(data = us, aes(x = date)) + 
  geom_area(aes(y = perc_sequences, color = variant, fill = variant), show.legend =FALSE, alpha = 0.5, position = "dodge") + 
  geom_line(aes(y = new_cases_smoothed_per_million / 40)) + 
  scale_y_continuous("Percent of Sequences", sec.axis=sec_axis(~.*40, name = "New Cases Per Million")) + 
  theme_minimal() + 
  labs(title = "Proportion of Covid Variants vs New Cases Per Million")  +
  annotate(geom="label", x=ymd(20200701), y=75, label="Alpha/Other") +
  annotate(geom="label", x=ymd(20210901), y=75, label="Delta") +
  annotate(geom="label", x=ymd(20220201), y=75, label="Omicron")


variants_deaths_plot <- ggplot(data = us, aes(x = date)) + 
  geom_area(aes(y = perc_sequences, color = variant, fill = variant),show.legend =FALSE, alpha = 0.5, position = "dodge") + 
  geom_line(aes(y = new_deaths_smoothed_per_million*5)) + 
  scale_y_continuous("Percent of Sequences", sec.axis=sec_axis(~./5, name = "New Deaths Per Million")) + 
  theme_minimal() + 
  labs(title = "Proportion of Covid Variants vs New Deaths Per Million") +
  annotate(geom="label", x=ymd(20200701), y=75, label="Alpha/Other") +
  annotate(geom="label", x=ymd(20210901), y=75, label="Delta") +
  annotate(geom="label", x=ymd(20220201), y=75, label="Omicron")


cases_vaccinations_plot <- ggplot(data = us, aes(x = date)) +
  geom_line(aes(y = new_cases_smoothed_per_million), show.legend = FALSE) +
  geom_line(aes(y = people_vaccinated_per_hundred*50)) + 
  scale_y_continuous("New Cases Per Million", sec.axis=sec_axis(~./50, name = "People Vaccinated Per Hundred")) + 
  theme_minimal() + 
  labs(title = "New Cases Per Million vs. People Vaccinated Per Hundred")

deaths_vaccinations_plot <- ggplot(us, aes(x = date)) +
  geom_line(aes(y = new_deaths_per_million), show.legend = FALSE) +
  geom_line(aes(y = people_fully_vaccinated_per_hundred/7)) + 
  scale_y_continuous("New Deaths Per Million", sec.axis=sec_axis(~.*7, name = "People Vaccinated Per Hundred")) + 
  theme_minimal() + 
  labs(title = "New Deaths Per Million vs. People Fully Vaccinated Per Hundred")


variants_hospitalizations_plot <- ggplot(us, aes(x = date)) + 
  geom_area(aes(y = perc_sequences, color = variant, fill = variant), show.legend =FALSE, alpha = 0.5, position = "dodge") + 
  geom_line(aes(y = weekly_hosp_admissions_per_million / 5)) + 
  scale_y_continuous("Percent of Sequences", sec.axis=sec_axis(~.*5, name = "Hospitalizations Per Million")) + 
  theme_minimal() + 
  labs(title = "Proportion of Covid Variants vs Hospitalizations Per Million") +
  annotate(geom="label", x=ymd(20200701), y=75, label="Alpha/Other") +
  annotate(geom="label", x=ymd(20210901), y=75, label="Delta") +
  annotate(geom="label", x=ymd(20220201), y=75, label="Omicron")

variants_vaccinations_plot <- ggplot(us, aes(x = date)) + 
  geom_area(aes(y = perc_sequences, color = variant, fill = variant), show.legend =FALSE, alpha = 0.5, position = "dodge") + 
  geom_line(aes(y = people_fully_vaccinated_per_hundred)) + 
  scale_y_continuous("Percent of Sequences", sec.axis=sec_axis(~., name = "People Vaccinated Per Hundred")) + 
  theme_minimal() + 
  labs(title = "Proportion of Covid Variants vs People Fully Vaccinated") +
  annotate(geom="label", x=ymd(20200701), y=75, label="Alpha/Other") +
  annotate(geom="label", x=ymd(20210901), y=75, label="Delta") +
  annotate(geom="label", x=ymd(20220201), y=75, label="Omicron")

variants_vaccinations_plot
vaccinations_plot
Warning: Removed 404 row(s) containing missing values (geom_path).

variants_cases_plot <- ggplot(data = us, aes(x = date)) + 
  geom_area(aes(y = perc_sequences, color = variant, fill = variant), show.legend =FALSE, alpha = 0.5, position = "dodge") + 
  geom_line(aes(y = new_cases_smoothed_per_million / 40)) + 
  scale_y_continuous("Percent of Sequences", sec.axis=sec_axis(~.*40, name = "New Cases Per Million")) + 
  theme_minimal() + 
  labs(title = "Proportion of Covid Variants vs New Cases Per Million") +
  annotate(geom="label", x=ymd(20200701), y=75, label="Alpha/Other") +
  annotate(geom="label", x=ymd(20210901), y=75, label="Delta") +
  annotate(geom="label", x=ymd(20220201), y=75, label="Omicron")

variants_cases_plot
Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 7 row(s) containing missing values (geom_path).

variants_hospitalizations_plot
Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 206 row(s) containing missing values (geom_path).

variants_deaths_plot
Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 45 row(s) containing missing values (geom_path).

Time Series Analysis

us %>% 
  plot_time_series(date, new_cases_smoothed_per_million)
us %>% 
  plot_acf_diagnostics(date, new_cases_smoothed_per_million, .show_white_noise_bars = T) 
gisaid_variants %>% 
  filter(Country == "USA", variant %in% c("VOC Omicron GRA (B.1.1.529+BA.*) ", "VOC Delta GK (B.1.617.2+AY.*) ", "VOC Alpha GRY (B.1.1.7+Q.*) ")) %>% 
  plot_time_series(date, perc_sequences, .facet_vars=variant, .legend_show = FALSE)
gisaid_variants %>% 
  filter(Country == "USA", variant %in% c("VOC Omicron GRA (B.1.1.529+BA.*) ", "VOC Delta GK (B.1.617.2+AY.*) ", "VOC Alpha GRY (B.1.1.7+Q.*) ")) %>% 
  group_by(variant) %>% 
  plot_acf_diagnostics(date, perc_sequences, .show_white_noise_bars = T) 
Max lag exceeds data available. Using max lag: 73
Max lag exceeds data available. Using max lag: 80
Max lag exceeds data available. Using max lag: 22
library("sf")
Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
[1] "sf"         "data.frame"
unique(gisaid$Country)
  [1] "Afghanistan"                      "Albania"                          "Algeria"                          "American Samoa"                  
  [5] "Andorra"                          "Angola"                           "Anguilla"                         "Antigua and Barbuda"             
  [9] "Argentina"                        "Armenia"                          "Aruba"                            "Australia"                       
 [13] "Austria"                          "Azerbaijan"                       "Bahrain"                          "Bangladesh"                      
 [17] "Barbados"                         "Belarus"                          "Belgium"                          "Belize"                          
 [21] "Benin"                            "Bermuda"                          "Bolivia"                          "Bonaire"                         
 [25] "Bosnia and Herzegovina"           "Botswana"                         "Brazil"                           "British Virgin Islands"          
 [29] "Brunei"                           "Bulgaria"                         "Burkina Faso"                     "Burundi"                         
 [33] "Cabo Verde"                       "Cambodia"                         "Cameroon"                         "Canada"                          
 [37] "Canary Islands"                   "Cayman Islands"                   "Central African Republic"         "Chad"                            
 [41] "Chile"                            "China"                            "Colombia"                         "Comoros"                         
 [45] "Costa Rica"                       "Cote d'Ivoire"                    "Crimea"                           "Croatia"                         
 [49] "Cuba"                             "Curacao"                          "Cyprus"                           "Czech Republic"                  
 [53] "Democratic Republic of the Congo" "Denmark"                          "Djibouti"                         "Dominica"                        
 [57] "Dominican Republic"               "Ecuador"                          "Egypt"                            "El Salvador"                     
 [61] "Equatorial Guinea"                "Estonia"                          "Eswatini"                         "Ethiopia"                        
 [65] "Faroe Islands"                    "Fiji"                             "Finland"                          "France"                          
 [69] "French Guiana"                    "French Polynesia"                 "Gabon"                            "Gambia"                          
 [73] "Georgia"                          "Germany"                          "Ghana"                            "Gibraltar"                       
 [77] "Greece"                           "Grenada"                          "Guadeloupe"                       "Guam"                            
 [81] "Guatemala"                        "Guinea"                           "Guinea-Bissau"                    "Guyana"                          
 [85] "Haiti"                            "Honduras"                         "Hong Kong"                        "Hungary"                         
 [89] "Iceland"                          "India"                            "Indonesia"                        "Iran"                            
 [93] "Iraq"                             "Ireland"                          "Israel"                           "Italy"                           
 [97] "Jamaica"                          "Japan"                            "Jordan"                           "Kazakhstan"                      
[101] "Kenya"                            "Kosovo"                           "Kuwait"                           "Kyrgyzstan"                      
[105] "Laos"                             "Latvia"                           "Lebanon"                          "Lesotho"                         
[109] "Liberia"                          "Libya"                            "Liechtenstein"                    "Lithuania"                       
[113] "Luxembourg"                       "Madagascar"                       "Malawi"                           "Malaysia"                        
[117] "Maldives"                         "Mali"                             "Malta"                            "Martinique"                      
[121] "Mauritania"                       "Mauritius"                        "Mayotte"                          "Mexico"                          
[125] "Moldova"                          "Monaco"                           "Mongolia"                         "Montenegro"                      
[129] "Montserrat"                       "Morocco"                          "Mozambique"                       "Myanmar"                         
[133] "Namibia"                          "Nepal"                            "Netherlands"                      "New Caledonia"                   
[137] "New Zealand"                      "Nicaragua"                        "Niger"                            "Nigeria"                         
[141] "North Macedonia"                  "Northern Mariana Islands"         "Norway"                           "Oman"                            
[145] "Pakistan"                         "Palau"                            "Palestine"                        "Panama"                          
[149] "Papua New Guinea"                 "Paraguay"                         "Peru"                             "Philippines"                     
[153] "Poland"                           "Portugal"                         "Puerto Rico"                      "Qatar"                           
[157] "Republic of the Congo"            "Reunion"                          "Romania"                          "Russia"                          
[161] "Rwanda"                           "Saint Barthelemy"                 "Saint Kitts and Nevis"            "Saint Lucia"                     
[165] "Saint Martin"                     "Saint Vincent and the Grenadines" "Sao Tome and Principe"            "Saudi Arabia"                    
[169] "Senegal"                          "Serbia"                           "Seychelles"                       "Sierra Leone"                    
[173] "Singapore"                        "Sint Eustatius"                   "Sint Maarten"                     "Slovakia"                        
[177] "Slovenia"                         "Solomon Islands"                  "Somalia"                          "South Africa"                    
[181] "South Korea"                      "South Sudan"                      "Spain"                            "Sri Lanka"                       
[185] "Sudan"                            "Suriname"                         "Sweden"                           "Switzerland"                     
[189] "Syria"                            "Taiwan"                           "Tanzania"                         "Thailand"                        
[193] "The Bahamas"                      "Timor-Leste"                      "Togo"                             "Trinidad and Tobago"             
[197] "Tunisia"                          "Turkey"                           "Turks and Caicos Islands"         "U.S. Virgin Islands"             
[201] "USA"                              "Uganda"                           "Ukraine"                          "United Arab Emirates"            
[205] "United Kingdom"                   "Uruguay"                          "Uzbekistan"                       "Vanuatu"                         
[209] "Venezuela"                        "Vietnam"                          "Wallis and Futuna Islands"        "Zambia"                          
[213] "Zimbabwe"                        
unique(covid$location)
  [1] "Afghanistan"                      "Africa"                           "Albania"                          "Algeria"                         
  [5] "Andorra"                          "Angola"                           "Anguilla"                         "Antigua and Barbuda"             
  [9] "Argentina"                        "Armenia"                          "Aruba"                            "Asia"                            
 [13] "Australia"                        "Austria"                          "Azerbaijan"                       "Bahamas"                         
 [17] "Bahrain"                          "Bangladesh"                       "Barbados"                         "Belarus"                         
 [21] "Belgium"                          "Belize"                           "Benin"                            "Bermuda"                         
 [25] "Bhutan"                           "Bolivia"                          "Bonaire Sint Eustatius and Saba"  "Bosnia and Herzegovina"          
 [29] "Botswana"                         "Brazil"                           "British Virgin Islands"           "Brunei"                          
 [33] "Bulgaria"                         "Burkina Faso"                     "Burundi"                          "Cambodia"                        
 [37] "Cameroon"                         "Canada"                           "Cape Verde"                       "Cayman Islands"                  
 [41] "Central African Republic"         "Chad"                             "Chile"                            "China"                           
 [45] "Colombia"                         "Comoros"                          "Congo"                            "Cook Islands"                    
 [49] "Costa Rica"                       "Cote d'Ivoire"                    "Croatia"                          "Cuba"                            
 [53] "Curacao"                          "Cyprus"                           "Czechia"                          "Democratic Republic of Congo"    
 [57] "Denmark"                          "Djibouti"                         "Dominica"                         "Dominican Republic"              
 [61] "Ecuador"                          "Egypt"                            "El Salvador"                      "Equatorial Guinea"               
 [65] "Eritrea"                          "Estonia"                          "Eswatini"                         "Ethiopia"                        
 [69] "Europe"                           "European Union"                   "Faeroe Islands"                   "Falkland Islands"                
 [73] "Fiji"                             "Finland"                          "France"                           "French Polynesia"                
 [77] "Gabon"                            "Gambia"                           "Georgia"                          "Germany"                         
 [81] "Ghana"                            "Gibraltar"                        "Greece"                           "Greenland"                       
 [85] "Grenada"                          "Guam"                             "Guatemala"                        "Guernsey"                        
 [89] "Guinea"                           "Guinea-Bissau"                    "Guyana"                           "Haiti"                           
 [93] "High income"                      "Honduras"                         "Hong Kong"                        "Hungary"                         
 [97] "Iceland"                          "India"                            "Indonesia"                        "International"                   
[101] "Iran"                             "Iraq"                             "Ireland"                          "Isle of Man"                     
[105] "Israel"                           "Italy"                            "Jamaica"                          "Japan"                           
[109] "Jersey"                           "Jordan"                           "Kazakhstan"                       "Kenya"                           
[113] "Kiribati"                         "Kosovo"                           "Kuwait"                           "Kyrgyzstan"                      
[117] "Laos"                             "Latvia"                           "Lebanon"                          "Lesotho"                         
[121] "Liberia"                          "Libya"                            "Liechtenstein"                    "Lithuania"                       
[125] "Low income"                       "Lower middle income"              "Luxembourg"                       "Macao"                           
[129] "Madagascar"                       "Malawi"                           "Malaysia"                         "Maldives"                        
[133] "Mali"                             "Malta"                            "Marshall Islands"                 "Mauritania"                      
[137] "Mauritius"                        "Mexico"                           "Micronesia (country)"             "Moldova"                         
[141] "Monaco"                           "Mongolia"                         "Montenegro"                       "Montserrat"                      
[145] "Morocco"                          "Mozambique"                       "Myanmar"                          "Namibia"                         
[149] "Nauru"                            "Nepal"                            "Netherlands"                      "New Caledonia"                   
[153] "New Zealand"                      "Nicaragua"                        "Niger"                            "Nigeria"                         
[157] "Niue"                             "North America"                    "North Macedonia"                  "Northern Cyprus"                 
[161] "Northern Mariana Islands"         "Norway"                           "Oceania"                          "Oman"                            
[165] "Pakistan"                         "Palau"                            "Palestine"                        "Panama"                          
[169] "Papua New Guinea"                 "Paraguay"                         "Peru"                             "Philippines"                     
[173] "Pitcairn"                         "Poland"                           "Portugal"                         "Puerto Rico"                     
[177] "Qatar"                            "Romania"                          "Russia"                           "Rwanda"                          
[181] "Saint Helena"                     "Saint Kitts and Nevis"            "Saint Lucia"                      "Saint Pierre and Miquelon"       
[185] "Saint Vincent and the Grenadines" "Samoa"                            "San Marino"                       "Sao Tome and Principe"           
[189] "Saudi Arabia"                     "Senegal"                          "Serbia"                           "Seychelles"                      
[193] "Sierra Leone"                     "Singapore"                        "Sint Maarten (Dutch part)"        "Slovakia"                        
[197] "Slovenia"                         "Solomon Islands"                  "Somalia"                          "South Africa"                    
[201] "South America"                    "South Korea"                      "South Sudan"                      "Spain"                           
[205] "Sri Lanka"                        "Sudan"                            "Suriname"                         "Sweden"                          
[209] "Switzerland"                      "Syria"                            "Taiwan"                           "Tajikistan"                      
[213] "Tanzania"                         "Thailand"                         "Timor"                            "Togo"                            
[217] "Tokelau"                          "Tonga"                            "Trinidad and Tobago"              "Tunisia"                         
[221] "Turkey"                           "Turkmenistan"                     "Turks and Caicos Islands"         "Tuvalu"                          
[225] "Uganda"                           "Ukraine"                          "United Arab Emirates"             "United Kingdom"                  
[229] "United States"                    "United States Virgin Islands"     "Upper middle income"              "Uruguay"                         
[233] "Uzbekistan"                       "Vanuatu"                          "Vatican"                          "Venezuela"                       
[237] "Vietnam"                          "Wallis and Futuna"                "World"                            "Yemen"                           
[241] "Zambia"                           "Zimbabwe"                        
world_variants <- gisaid %>% 
  group_by(Country) %>% 
  mutate(Country = case_when(
  Country == "USA" ~ "United States",
  TRUE ~ as.character(Country)
  )) %>% 
  summarise(most_recent_date = date[n()], 
            prevalent_variant = variant[date == date[n()] & Type == "Variant" & perc_sequences == max(perc_sequences)]) %>% 
            #prevalent_lineage = variant[date == date[n()] & Type == "Lineage" & perc_sequences == max(perc_sequences)]) %>% 
  rename(location = Country)
`summarise()` has grouped output by 'Country'. You can override using the `.groups` argument.
world_variants <- left_join(world_variants, covid[, c("location", "iso_code")], by = "location", all.x = TRUE) %>% 
  rename(gu_a3 = iso_code)

world_variants_map <- left_join(world, world_variants, by = "gu_a3", all.x = TRUE)
p <- ggplot(data = world_variants_map, aes(fill = prevalent_variant)) + 
  geom_sf(show.legend = FALSE) + 
  xlab("Longitude") + 
  ylab("Latitude") + 
  theme(panel.grid.major = element_line(color = gray(.5), linetype = "dashed", size = 0.5), panel.background = element_rect(fill = "aliceblue")) 
#p
LS0tDQp0aXRsZTogIkNPVklELTE5IFZhcmlhbnRzIEFuYWx5c2lzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCiNrbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQpgYGANCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY29tbWVudD1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGd0YWJsZSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHZ0YWJsZSkNCmxpYnJhcnkocmpzb24pDQpsaWJyYXJ5KHRpbWV0aykNCmxpYnJhcnkoUnNzYSkNCmBgYA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY292aWQgPC0gcmVhZF9jc3YoImRhdGEvb3dpZC1jb3ZpZC1kYXRhLmNzdiIsc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCiN2YXJpYW50cyA8LSByZWFkX2NzdigiZGF0YS9jb3ZpZC12YXJpYW50cy5jc3YiLHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQoNCmdpc2FpZCA8LSBhcy5kYXRhLmZyYW1lKGZyZWFkKCJkYXRhL2dpc2FpZF92YXJpYW50c19zdGF0aXN0aWNzLnRzdiIpKSAlPiUgDQogIHJlbmFtZShkYXRlID0gYFdlZWsgcHJpb3IgdG9gLA0KICAgICAgICAgY291bnQgPSBgU3VibWlzc2lvbiBDb3VudGAsDQogICAgICAgICBwZXJjX3NlcXVlbmNlcyA9IGAlIHBlciBDb3VudHJ5IGFuZCBXZWVrYCwNCiAgICAgICAgIHRvdGFsID0gYFRvdGFsIHBlciBDb3VudHJ5IGFuZCBXZWVrYCwNCiAgICAgICAgIHZhcmlhbnQgPSBWYWx1ZSkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSwNCiAgICAgICAgIHBlcmNfc2VxdWVuY2VzID0gcm91bmQoY291bnQgLyB0b3RhbCAqIDEwMCwgMykpIyAlPiUgDQojICBzZXBhcmF0ZSh2YXJpYW50LCBpbnRvID0gYygidmFyaWFudCIsICJvcmlnaW4iKSwgc2VwID0gYygiZmlyc3QgZGV0ZWN0ZWQgaW4gIikpDQoNCmdpc2FpZF92YXJpYW50cyA8LSBnaXNhaWQgJT4lIA0KICBmaWx0ZXIoVHlwZSA9PSAiVmFyaWFudCIpICU+JQ0KICBzZXBhcmF0ZSh2YXJpYW50LCBjKCJ2YXJpYW50IiwgIm9yaWdpbiIpLCBzZXAgPSAiZmlyc3QgZGV0ZWN0ZWQgaW4gIikgJT4lIA0KICBzZWxlY3QoLVR5cGUpDQpgYGANCg0KYGBge3J9DQpjb3ZpZF9OQXMgPC0gY292aWQgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbikgJT4lIA0KICBzdW1tYXJpc2VfYWxsKGZ1bnMoc3VtKGlzLm5hKC4pKSkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtbG9jYXRpb24sIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIk5BcyIpICU+JSANCiAgbXV0YXRlKFBlcmNlbnQgPSByb3VuZChOQXMgLyBucm93KGNvdmlkKSAqIDEwMCAsMikpICU+JSANCiAgYXJyYW5nZSgtTkFzKQ0KYGBgDQoNCmBgYHtyfQ0KY292aWRfTkFzICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BjdF9uYSA9IHN1bShQZXJjZW50KSkgJT4lIA0KICBhcnJhbmdlKHRvdGFsX3BjdF9uYSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gJ3RvcCcpDQpgYGANCg0KYGBge3J9DQojSGVscGVyIGZ1bmN0aW9uIGZvciBmaWx0ZXJpbmcgZGF0YQ0KbXlfZGF0YSA8LSBmdW5jdGlvbihjb3VudHJ5X2NvdmlkX2ZpbHRlciwgY291bnRyeV9naXNhaWRfZmlsdGVyKXsNCiAgZGF0YSA8LSBjb3ZpZCAlPiUgDQogICAgZmlsdGVyKGxvY2F0aW9uID09IGNvdW50cnlfY292aWRfZmlsdGVyKQ0KICBnaXNhaWRfZGF0YSA8LSBnaXNhaWRfdmFyaWFudHMgJT4lIA0KICAgIGZpbHRlcihDb3VudHJ5ID09IGNvdW50cnlfZ2lzYWlkX2ZpbHRlcikNCiAgZGF0YSA8LSBsZWZ0X2pvaW4oZGF0YSwgZ2lzYWlkX2RhdGEsIGJ5ID0gImRhdGUiKQ0KICBkYXRhDQp9DQoNCnVzIDwtIG15X2RhdGEoIlVuaXRlZCBTdGF0ZXMiLCAiVVNBIikNCmBgYA0KDQoNCmBgYHtyICJVUyBQbG90cyJ9DQp2YXJpYW50c19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9hcmVhKGFlcyh5ID0gcGVyY19zZXF1ZW5jZXMsIGNvbG9yID0gdmFyaWFudCwgZmlsbCA9IHZhcmlhbnQpLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KY2FzZXNfcGxvdCA8LQ0KICBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19wZXJfbWlsbGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2RlYXRoc19wZXJfbWlsbGlvbikpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCmRlYXRoc19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2RlYXRoc19wZXJfbWlsbGlvbikpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCnZhY2NpbmF0aW9uc19wbG90IDwtIGdncGxvdCh1cywgYWVzKHggPSBkYXRlKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfdmFjY2luYXRpb25zX3Ntb290aGVkX3Blcl9taWxsaW9uKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQp2YXJpYW50c19jYXNlc19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb24gLyA0MCkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+Lio0MCwgbmFtZSA9ICJOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSAgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjAwNzAxKSwgeT03NSwgbGFiZWw9IkFscGhhL090aGVyIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwOTAxKSwgeT03NSwgbGFiZWw9IkRlbHRhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjIwMjAxKSwgeT03NSwgbGFiZWw9Ik9taWNyb24iKQ0KDQoNCnZhcmlhbnRzX2RlYXRoc19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSxzaG93LmxlZ2VuZCA9RkFMU0UsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19kZWF0aHNfc21vb3RoZWRfcGVyX21pbGxpb24qNSkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+Li81LCBuYW1lID0gIk5ldyBEZWF0aHMgUGVyIE1pbGxpb24iKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBOZXcgRGVhdGhzIFBlciBNaWxsaW9uIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjAwNzAxKSwgeT03NSwgbGFiZWw9IkFscGhhL090aGVyIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwOTAxKSwgeT03NSwgbGFiZWw9IkRlbHRhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjIwMjAxKSwgeT03NSwgbGFiZWw9Ik9taWNyb24iKQ0KDQoNCmNhc2VzX3ZhY2NpbmF0aW9uc19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2Nhc2VzX3Ntb290aGVkX3Blcl9taWxsaW9uKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBwZW9wbGVfdmFjY2luYXRlZF9wZXJfaHVuZHJlZCo1MCkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiTmV3IENhc2VzIFBlciBNaWxsaW9uIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4vNTAsIG5hbWUgPSAiUGVvcGxlIFZhY2NpbmF0ZWQgUGVyIEh1bmRyZWQiKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIHZzLiBQZW9wbGUgVmFjY2luYXRlZCBQZXIgSHVuZHJlZCIpDQoNCmRlYXRoc192YWNjaW5hdGlvbnNfcGxvdCA8LSBnZ3Bsb3QodXMsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2RlYXRoc19wZXJfbWlsbGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gcGVvcGxlX2Z1bGx5X3ZhY2NpbmF0ZWRfcGVyX2h1bmRyZWQvNykpICsgDQogIHNjYWxlX3lfY29udGludW91cygiTmV3IERlYXRocyBQZXIgTWlsbGlvbiIsIHNlYy5heGlzPXNlY19heGlzKH4uKjcsIG5hbWUgPSAiUGVvcGxlIFZhY2NpbmF0ZWQgUGVyIEh1bmRyZWQiKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiTmV3IERlYXRocyBQZXIgTWlsbGlvbiB2cy4gUGVvcGxlIEZ1bGx5IFZhY2NpbmF0ZWQgUGVyIEh1bmRyZWQiKQ0KDQoNCnZhcmlhbnRzX2hvc3BpdGFsaXphdGlvbnNfcGxvdCA8LSBnZ3Bsb3QodXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSB3ZWVrbHlfaG9zcF9hZG1pc3Npb25zX3Blcl9taWxsaW9uIC8gNSkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+Lio1LCBuYW1lID0gIkhvc3BpdGFsaXphdGlvbnMgUGVyIE1pbGxpb24iKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBIb3NwaXRhbGl6YXRpb25zIFBlciBNaWxsaW9uIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjAwNzAxKSwgeT03NSwgbGFiZWw9IkFscGhhL090aGVyIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwOTAxKSwgeT03NSwgbGFiZWw9IkRlbHRhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjIwMjAxKSwgeT03NSwgbGFiZWw9Ik9taWNyb24iKQ0KDQp2YXJpYW50c192YWNjaW5hdGlvbnNfcGxvdCA8LSBnZ3Bsb3QodXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBwZW9wbGVfZnVsbHlfdmFjY2luYXRlZF9wZXJfaHVuZHJlZCkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+LiwgbmFtZSA9ICJQZW9wbGUgVmFjY2luYXRlZCBQZXIgSHVuZHJlZCIpKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgbGFicyh0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIENvdmlkIFZhcmlhbnRzIHZzIFBlb3BsZSBGdWxseSBWYWNjaW5hdGVkIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjAwNzAxKSwgeT03NSwgbGFiZWw9IkFscGhhL090aGVyIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwOTAxKSwgeT03NSwgbGFiZWw9IkRlbHRhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjIwMjAxKSwgeT03NSwgbGFiZWw9Ik9taWNyb24iKQ0KDQp2YXJpYW50c192YWNjaW5hdGlvbnNfcGxvdA0KYGBgDQoNCmBgYHtyfQ0KdmFjY2luYXRpb25zX3Bsb3QNCmBgYA0KDQpgYGB7cn0NCnZhcmlhbnRzX2Nhc2VzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSB1cywgYWVzKHggPSBkYXRlKSkgKyANCiAgZ2VvbV9hcmVhKGFlcyh5ID0gcGVyY19zZXF1ZW5jZXMsIGNvbG9yID0gdmFyaWFudCwgZmlsbCA9IHZhcmlhbnQpLCBzaG93LmxlZ2VuZCA9RkFMU0UsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbiAvIDQwKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKCJQZXJjZW50IG9mIFNlcXVlbmNlcyIsIHNlYy5heGlzPXNlY19heGlzKH4uKjQwLCBuYW1lID0gIk5ldyBDYXNlcyBQZXIgTWlsbGlvbiIpKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgbGFicyh0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIENvdmlkIFZhcmlhbnRzIHZzIE5ldyBDYXNlcyBQZXIgTWlsbGlvbiIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIwMDcwMSksIHk9NzUsIGxhYmVsPSJBbHBoYS9PdGhlciIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIwMSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCg0KdmFyaWFudHNfY2FzZXNfcGxvdA0KYGBgDQoNCmBgYHtyfQ0KdmFyaWFudHNfaG9zcGl0YWxpemF0aW9uc19wbG90DQpgYGANCg0KYGBge3J9DQp2YXJpYW50c19kZWF0aHNfcGxvdA0KYGBgDQoNCg0KIyBUaW1lIFNlcmllcyBBbmFseXNpcw0KDQpgYGB7cn0NCnVzICU+JSANCiAgcGxvdF90aW1lX3NlcmllcyhkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb24pDQpgYGANCg0KYGBge3J9DQp1cyAlPiUgDQogIHBsb3RfYWNmX2RpYWdub3N0aWNzKGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbiwgLnNob3dfd2hpdGVfbm9pc2VfYmFycyA9IFQpIA0KYGBgDQoNCg0KYGBge3J9DQpnaXNhaWRfdmFyaWFudHMgJT4lIA0KICBmaWx0ZXIoQ291bnRyeSA9PSAiVVNBIiwgdmFyaWFudCAlaW4lIGMoIlZPQyBPbWljcm9uIEdSQSAoQi4xLjEuNTI5K0JBLiopICIsICJWT0MgRGVsdGEgR0sgKEIuMS42MTcuMitBWS4qKSAiLCAiVk9DIEFscGhhIEdSWSAoQi4xLjEuNytRLiopICIpKSAlPiUgDQogIHBsb3RfdGltZV9zZXJpZXMoZGF0ZSwgcGVyY19zZXF1ZW5jZXMsIC5mYWNldF92YXJzPXZhcmlhbnQsIC5sZWdlbmRfc2hvdyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KZ2lzYWlkX3ZhcmlhbnRzICU+JSANCiAgZmlsdGVyKENvdW50cnkgPT0gIlVTQSIsIHZhcmlhbnQgJWluJSBjKCJWT0MgT21pY3JvbiBHUkEgKEIuMS4xLjUyOStCQS4qKSAiLCAiVk9DIERlbHRhIEdLIChCLjEuNjE3LjIrQVkuKikgIiwgIlZPQyBBbHBoYSBHUlkgKEIuMS4xLjcrUS4qKSAiKSkgJT4lIA0KICBncm91cF9ieSh2YXJpYW50KSAlPiUgDQogIHBsb3RfYWNmX2RpYWdub3N0aWNzKGRhdGUsIHBlcmNfc2VxdWVuY2VzLCAuc2hvd193aGl0ZV9ub2lzZV9iYXJzID0gVCkgDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KCJzZiIpDQpsaWJyYXJ5KCJybmF0dXJhbGVhcnRoIikNCmxpYnJhcnkoInJuYXR1cmFsZWFydGhkYXRhIikNCg0Kd29ybGQgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCmNsYXNzKHdvcmxkKQ0KYGBgDQoNCmBgYHtyfQ0KdW5pcXVlKGdpc2FpZCRDb3VudHJ5KQ0KYGBgDQoNCmBgYHtyfQ0KdW5pcXVlKGNvdmlkJGxvY2F0aW9uKQ0KYGBgDQoNCg0KYGBge3J9DQp3b3JsZF92YXJpYW50cyA8LSBnaXNhaWQgJT4lIA0KICBncm91cF9ieShDb3VudHJ5KSAlPiUgDQogIG11dGF0ZShDb3VudHJ5ID0gY2FzZV93aGVuKA0KICBDb3VudHJ5ID09ICJVU0EiIH4gIlVuaXRlZCBTdGF0ZXMiLA0KICBUUlVFIH4gYXMuY2hhcmFjdGVyKENvdW50cnkpDQogICkpICU+JSANCiAgc3VtbWFyaXNlKG1vc3RfcmVjZW50X2RhdGUgPSBkYXRlW24oKV0sIA0KICAgICAgICAgICAgcHJldmFsZW50X3ZhcmlhbnQgPSB2YXJpYW50W2RhdGUgPT0gZGF0ZVtuKCldICYgVHlwZSA9PSAiVmFyaWFudCIgJiBwZXJjX3NlcXVlbmNlcyA9PSBtYXgocGVyY19zZXF1ZW5jZXMpXSkgJT4lIA0KICAgICAgICAgICAgI3ByZXZhbGVudF9saW5lYWdlID0gdmFyaWFudFtkYXRlID09IGRhdGVbbigpXSAmIFR5cGUgPT0gIkxpbmVhZ2UiICYgcGVyY19zZXF1ZW5jZXMgPT0gbWF4KHBlcmNfc2VxdWVuY2VzKV0pICU+JSANCiAgcmVuYW1lKGxvY2F0aW9uID0gQ291bnRyeSkNCg0Kd29ybGRfdmFyaWFudHMgPC0gbGVmdF9qb2luKHdvcmxkX3ZhcmlhbnRzLCBjb3ZpZFssIGMoImxvY2F0aW9uIiwgImlzb19jb2RlIildLCBieSA9ICJsb2NhdGlvbiIsIGFsbC54ID0gVFJVRSkgJT4lIA0KICByZW5hbWUoZ3VfYTMgPSBpc29fY29kZSkNCg0Kd29ybGRfdmFyaWFudHNfbWFwIDwtIGxlZnRfam9pbih3b3JsZCwgd29ybGRfdmFyaWFudHMsIGJ5ID0gImd1X2EzIiwgYWxsLnggPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KcCA8LSBnZ3Bsb3QoZGF0YSA9IHdvcmxkX3ZhcmlhbnRzX21hcCwgYWVzKGZpbGwgPSBwcmV2YWxlbnRfdmFyaWFudCkpICsgDQogIGdlb21fc2Yoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyANCiAgeGxhYigiTG9uZ2l0dWRlIikgKyANCiAgeWxhYigiTGF0aXR1ZGUiKSArIA0KICB0aGVtZShwYW5lbHMuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9IGdyYXkoLjUpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMC41KSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImFsaWNlYmx1ZSIpKSANCmBgYA0KDQpgYGB7cn0NCiNwDQpgYGANCg0KDQo=